home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / wildcard.i < prev    next >
Text File  |  1997-10-26  |  4KB  |  126 lines

  1. IMPLEMENTATION MODULE WildCards;
  2.  
  3. FROM SYSTEM IMPORT ADR;
  4.  
  5. (*$R-,S-,W-,Z+,J+*)
  6.  
  7.  
  8. TYPE chPtr = POINTER TO CHAR;
  9.  
  10. PROCEDURE WildMat (s, p : chPtr; ignoreCase: BOOLEAN) : BOOLEAN; FORWARD;
  11.  
  12. PROCEDURE Star (source, pattern : chPtr; ignoreCase: BOOLEAN) : BOOLEAN;
  13. BEGIN
  14.   WHILE ~WildMat (source, pattern, ignoreCase) DO
  15.    INC (source);
  16.    IF source^=0C
  17.    THEN
  18.      RETURN FALSE
  19.    END;
  20.   END;
  21.   RETURN TRUE;
  22. END Star;
  23.    
  24. PROCEDURE WildMat (s, p : chPtr; ignoreCase: BOOLEAN) : BOOLEAN;
  25.   VAR last     : CARDINAL;
  26.       match,
  27.       reverse  : BOOLEAN;
  28.       pt       : chPtr;
  29.       source,
  30.       pattern  : chPtr;
  31. BEGIN
  32.     source := s;
  33.     pattern := p;
  34.     WHILE (pattern^ # 0C) DO
  35.       (* und am Ende source und pattern inkrementieren *)
  36.       
  37.        CASE pattern^ OF
  38.           '\' : (* Literal match with following character; fall through *)
  39.                 (* da schl„gt wieder eine 'C'-Besonderheit zu: da in C jeder
  40.                  * Case durchlaufen wird, bis ein continue oder break kommt,
  41.                  * wrde in den n„chsten F„llen einfach p+1 verglichen. Da
  42.                  * das in M2 aber nicht geht, muž ich stattdessen source dekrementieren
  43.                  * anstelle von p zu inkrementieren, damit nach dem n„chsten Schleifen-
  44.                  * durchlauf alles ok ist.
  45.                  *)
  46.                 INC (pattern);
  47.                 IF (pattern^ = 0C) OR (source^ <> pattern^) 
  48.                 THEN 
  49.                   RETURN FALSE;
  50.                 END; |
  51.         (* so, jetzt kommen die interessanten Sachen! *)
  52.           '?' : IF source^ = 0C THEN RETURN FALSE END |
  53.                 
  54.           '*' : (* Schon etwas komplizierter zu bersetzen *)
  55.                 INC (pattern);
  56.                 IF pattern^ = 0C
  57.                 THEN RETURN TRUE
  58.                 ELSE RETURN Star (source, pattern, ignoreCase)
  59.                 END; |
  60.         
  61.         (* So, und jetzt wird's richtig lustig *)
  62.           '[' : pt := pattern;
  63.                 INC (pt);
  64.                 reverse := (pt^ = '^');
  65.                 IF reverse THEN INC(pattern) END;
  66.                 
  67.                 last := 0400;
  68.                 match := FALSE;
  69.                 INC(pattern);
  70.                 WHILE (pattern # NIL) & (pattern^ # ']') DO
  71.                   IF pattern^='-'
  72.                   THEN
  73.                      (* erster Fall: match = true wenn *s<=*++p && *s >=last
  74.                       *)
  75.                       INC(pattern);
  76.                       IF ignoreCase
  77.                       THEN
  78.                         match := match OR ((CAP(source^) <= CAP(pattern^)) &
  79.                                            (ORD(source^) >=last));
  80.                       ELSE
  81.                         match := match OR ((source^ <= pattern^) &
  82.                                            (ORD(source^) >=last));
  83.                       END;
  84.                   ELSE
  85.                       (* zweiter Fall: match = true wenn *s==*p *)
  86.                       IF ignoreCase
  87.                       THEN
  88.                         match := match OR (CAP(source^)=CAP(pattern^));
  89.                       ELSE
  90.                         match := match OR (source^=pattern^);
  91.                       END;
  92.                   END;
  93.                   last := ORD(pattern^);
  94.                   INC(pattern);
  95.                 END;
  96.                 
  97.                 IF match = reverse THEN RETURN FALSE END; |
  98.        ELSE
  99.                 (* Default aus C-Source *)
  100.                 IF ignoreCase
  101.                 THEN
  102.                   IF CAP(source^) # CAP(pattern^) THEN RETURN FALSE END;
  103.                 ELSE
  104.                   IF source^ # pattern^ THEN RETURN FALSE END;
  105.                 END;
  106.        END (* CASE *);
  107.        INC(pattern);
  108.        INC(source);
  109.     END; (* WHILE *)
  110.     
  111.     RETURN (source^=0C);
  112. END WildMat;
  113.  
  114. PROCEDURE NameMatching (REF source, pattern: ARRAY OF CHAR ): BOOLEAN;
  115. BEGIN
  116.   RETURN WildMat (ADR(source), ADR(pattern), FALSE);
  117. END NameMatching;
  118.  
  119. PROCEDURE MatchName (REF source, pattern: ARRAY OF CHAR; ignoreCase: BOOLEAN): BOOLEAN;
  120. BEGIN
  121.   RETURN WildMat (ADR(source), ADR(pattern), ignoreCase);
  122. END MatchName;
  123.  
  124. END WildCards.
  125.  
  126.